#include "app_status_bar.h"

#if 0

static uint8_t blk = 50;
static uint8_t sta = 0;
static uint8_t soc = 50;

#if STATUS_BAR_USE_TOPIC_MESSENGER
static void init_read_time_cb(void *arg, size_t len) // 状态栏初始化时回调此接口获取信息
{
    uint8_t *time = (uint8_t *)arg;
    time[0] = 25; // 年
    time[1] = 3;  // 月
    time[2] = 9;  // 日
    time[3] = 0;  // 周
    time[4] = 21; // 时
    time[5] = 02; // 分
    time[6] = 50; // 秒
}
#endif

#if STATUS_BAR_USE_TOPIC_MESSENGER
static void init_read_soc_cb(void *arg, size_t len) // 状态栏初始化时回调此接口获取信息
{
    *(uint8_t *)arg = soc;
}
#endif

#if STATUS_BAR_USE_CONTROL_CENTER
#if STATUS_BAR_USE_BRIGHTNESS
static void get_brightness_cb(void *arg, size_t size) // 状态栏展开时回调此接口获取信息
{
    uint8_t *_blk = (uint8_t *)arg;
    //*blk = system_get_brightness();//返回对应数据
    *_blk = blk;
}

static void set_brightness_cb(void *arg, size_t size) // 控制中心控件事件处理示例
{
    blk = *(uint8_t *)arg;
    printf("brightness:%d\n", blk);
    // system_set_brightness(blk);
}
#endif

#if STATUS_BAR_USE_WIFI_SWITCH || STATUS_BAR_USE_WIFI_LIST
static void get_wifi_switch_cb(void *arg, size_t size) // 状态栏展开时回调此接口获取信息
{

    uint8_t *_sta = (uint8_t *)arg;
    //*sta = system_get_wifi_sta();//返回对应数据
    *_sta = sta;
}

static void set_wifi_switch_cb(void *arg, size_t size) // 控制中心控件事件处理示例
{
    sta = *(uint8_t *)arg;
    if (sta)
    {
        printf("WIFI ON\n");
        // system_set_wifi(on);
    }
    else
    {
        printf("WIFI OFF\n");
        // system_set_wifi(off);
    }
}
#endif
#endif

#if STATUS_BAR_USE_MUSIC

static uint8_t music_sta = 1;                // 0:无来源 1:暂停 2:播放
static uint16_t music_time[2] = {0, 2 * 60}; // 单位s，0：当前播放时间,1：总时间
static void get_music_sta_cb(void *var, size_t size)
{
    *(uint8_t *)var = music_sta;
}

static void get_music_time_cb(void *var, size_t size) // 状态栏获取播放时间
{
    memcpy((void *)var, music_time, sizeof(music_time));
    if (music_sta == 2)
    {
        music_time[0]++;
        if (music_time[0] == music_time[1])
            music_time[0] = 0;
    }
}

static void set_music_play_cb(void *var, size_t size) // 状态栏用户点击控制事件
{
    uint8_t key = *(uint8_t *)var; // 0：上一曲，  1：下一曲，  2：暂停，  3：播放
    if (key == 0)
    {
        printf("last song\n");
        music_time[0] = 0;
        music_sta = 2;
    }
    else if (key == 1)
    {
        printf("next song\n");
        music_time[0] = 0;
        music_sta = 2;
    }
    else if (key == 2)
    {
        printf("pause song\n");
        music_sta = 1;
    }
    else if (key == 3)
    {
        printf("play song\n");
        music_sta = 2;
    }
}

#endif

#if STATUS_BAR_USE_WIFI_LIST

static uint8_t wifi_rssi = 0;
static const char *wifi_name = "wifi-test";

static void wifi_rssi_cb(void *var, size_t size)
{
    *(uint8_t *)var = wifi_rssi;
    wifi_rssi++;
    if (wifi_rssi == 10)
        wifi_rssi = 0;
}

static void wifi_name_cb(void *var, size_t size)
{
    memcpy((char *)var, wifi_name, strlen(wifi_name));
}

#endif

static void soc_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    soc = lv_slider_get_value(e->target);
#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("电量更新", &soc, sizeof(soc));
#else
    status_bar_set_soc(soc);
#endif
}

static void time_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    static uint8_t time[7] = {25, 3, 9, 0, 21, 02, 50};
    time[1]++;
    if (time[1] > 12)
        time[1] = 1;
    time[2]++;
    if (time[2] > 30)
        time[2] = 1;
    time[5]++;
    if (time[5] > 59)
        time[5] = 0;
#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("时间更新", time, sizeof(time));
#else
    status_bar_set_time(time[0], time[1], time[2], time[3], time[4], time[5], time[6]);
#endif
}

static void charge_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    bool charge = lv_obj_has_state(e->target, LV_STATE_CHECKED);
#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("充电状态更新", &charge, sizeof(charge));
#else
    status_bar_set_charge_state(charge);
#endif
}

static void wifi_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    static uint8_t level = 5;
    level++;
    if (level > 5)
        level = 0;

#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("WIFI信号更新", &level, sizeof(level));
#else
    status_bar_set_wifi_rssi_level(level);
#endif
}

static void bt_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    bool bt = lv_obj_has_state(e->target, LV_STATE_CHECKED);
#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("蓝牙信号更新", &bt, 0);
#else
    status_bar_set_bt_state(charge);
#endif
}

static void show_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    bool fu = lv_obj_has_state(e->target, LV_STATE_CHECKED);
#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("状态栏显示", &fu, 1);
#else
    status_bar_hidden(fu);
#endif
}

static void expand_cb(lv_event_t *e) // 屏幕事件触发修改状态栏信息
{
    static uint8_t page = 1;
    lv_obj_clear_state(e->target, LV_STATE_CHECKED);
#if STATUS_BAR_USE_TOPIC_MESSENGER
    topic_messenger_msg("状态栏展开", &page, 1);
#else
    status_bar_expand(page);
#endif
    page++;
    if (page > 2)
        page = 1;
}

static void *create_ui(void *arg)
{
    lv_obj_t *label;

    lv_obj_t *scr = lv_obj_create(NULL);

    lv_obj_set_flex_flow(scr, LV_FLEX_FLOW_ROW_WRAP);
    lv_obj_set_style_flex_main_place(scr, LV_FLEX_ALIGN_SPACE_EVENLY, 0);
    lv_obj_set_style_layout(scr, LV_LAYOUT_FLEX, 0);
    lv_obj_set_style_pad_top(scr, 40, 0);
    lv_obj_set_style_pad_row(scr, 20, 0);

#if STATUS_BAR_USE_BATTERY
    lv_obj_t *soc = lv_slider_create(scr);
    lv_slider_set_range(soc, 0, 100);
    lv_slider_set_value(soc, 50, LV_ANIM_OFF);
    lv_obj_set_size(soc, LV_HOR_RES - 30, 20);
    lv_obj_add_event_cb(soc, soc_cb, LV_EVENT_VALUE_CHANGED, NULL);

    label = lv_label_create(soc);
    lv_label_set_text(label, "SOC");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);
#endif

#if STATUS_BAR_USE_TIME
    lv_obj_t *time = lv_btn_create(scr);
    lv_obj_set_size(time, 60, 60);
    lv_obj_add_event_cb(time, time_cb, LV_EVENT_CLICKED, NULL);

    label = lv_label_create(time);
    lv_label_set_text(label, "TIME");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);
#endif

#if STATUS_BAR_USE_BATTERY_CHARGE
    lv_obj_t *charge = lv_switch_create(scr);
    lv_obj_set_size(charge, 80, 40);
    lv_obj_add_event_cb(charge, charge_cb, LV_EVENT_VALUE_CHANGED, NULL);

    label = lv_label_create(charge);
    lv_label_set_text(label, "CHARGE");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);
#endif

#if STATUS_BAR_USE_WIFI
    lv_obj_t *wifi = lv_btn_create(scr);
    lv_obj_set_size(wifi, 60, 60);
    lv_obj_add_event_cb(wifi, wifi_cb, LV_EVENT_CLICKED, NULL);

    label = lv_label_create(wifi);
    lv_label_set_text(label, "WIFI");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);
#endif

#if STATUS_BAR_USE_BT
    lv_obj_t *bt = lv_switch_create(scr);
    lv_obj_set_size(bt, 80, 40);
    lv_obj_add_event_cb(bt, bt_cb, LV_EVENT_VALUE_CHANGED, NULL);

    label = lv_label_create(bt);
    lv_label_set_text(label, "BT");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);
#endif

    lv_obj_t *show = lv_switch_create(scr);
    lv_obj_set_size(show, 80, 40);
    lv_obj_add_event_cb(show, show_cb, LV_EVENT_VALUE_CHANGED, NULL);
#if STATUS_BAR_SHOW_DEFULT
    lv_obj_add_state(show, LV_STATE_CHECKED);
#endif

    label = lv_label_create(show);
    lv_label_set_text(label, "SHOW");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);

#if (STATUS_BAR_USE_NOTIFICATION || STATUS_BAR_USE_CONTROL_CENTER)
    lv_obj_t *expand = lv_switch_create(scr);
    lv_obj_set_size(expand, 80, 40);
    lv_obj_add_event_cb(expand, expand_cb, LV_EVENT_VALUE_CHANGED, NULL);

    label = lv_label_create(expand);
    lv_label_set_text(label, "EXPAND");
    lv_obj_set_style_text_color(label, lv_color_hex(0xff0000), 0);
    lv_obj_center(label);
#endif

    return scr;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////

// 创建打开/关闭WIFI的按钮示例：

LV_IMG_DECLARE(app_status_bar_img_wifi_switch);
static uint8_t now_wifi_sta; // wifi状态 0：关闭，  1：开启

static void get_wifi_sta_cb(void *userdata, size_t size) // 状态栏展开时会调用此函数查询状态
{
    *(uint8_t *)userdata = now_wifi_sta; // 返回WIFI开关状态
}

static void set_wifi_sta_cb(void *userdata, size_t size) // 用户按下按钮时会调用此函数设置状态
{
    now_wifi_sta = *(uint8_t *)userdata; // 获取控制状态
    if (now_wifi_sta)
    {
        // 打开wifi
        printf("set wifi on\n");
    }
    else
    {
        // 关闭wifi
        printf("set wifi off\n");
    }
}

static void create_user_switch() // 创建自定义按钮
{
    uint8_t pos[2] = {0, 5}; // 第6行第1列

    topic_messenger_list_t list = topic_messenger_list_create(); // 创建表

    topic_messenger_list_add(list, (void *)&app_status_bar_img_wifi_switch, 1); // 可选，不添加此行则不显示图标
    topic_messenger_list_add(list, pos, 2);                                     // 必选，设置位置
    topic_messenger_list_add(list, (void *)"设置WIFI状态", 3);                  // 可选，不添加此行则不产生点击事件，如只需要长按或只需要显示状态的功能
    topic_messenger_list_add(list, (void *)"获取WIFI状态", 4);                  // 可选，不添加此行则此按钮点击事件只有0（比如截屏这一类功能，点击后不需要开关状态）
    topic_messenger_list_add(list, (void *)"设置", 5);                          // 可选，不添加此行则不开启长按事件（没有对应的管理APP则不需要此功能）
    topic_messenger_list_add(list, (void *)"WLAN", 6);                          // 可选，不添加此行则在长按（如启用了）时打开对应APP，携带的数据为NULL

    topic_messenger_msg("状态栏创建开关", &list, 0); // 发布主题消息进行创建

    topic_messenger_subscribe(NULL, "获取WIFI状态", get_wifi_sta_cb); // 订阅主题消息获取状态
    topic_messenger_subscribe(NULL, "设置WIFI状态", set_wifi_sta_cb); // 订阅主题消息设置状态
}

/*
此示例功能：
在控制中心第6行第1列创建了一个控制WLAN开关的按钮
状态栏展开时，按钮会持续发布主题"获取WIFI状态"获取对应状态更新显示
按钮被点击时，会发布主题"设置WIFI状态"通知，携带状态0或1，用户订阅此主题即可获取状态0和1进行相应控制
当按钮被长按时，会打开APP名称为"设置"的APP，携带的数据为第一项"WLAN"，设置APP此时即可打开后跳转到WLAN页面（自行实现设置APP）
*/

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 创建自定义滑动条示例：

LV_IMG_DECLARE(app_status_bar_img_volume); // 图标声明
int16_t vol = 50;                          // 音量大小

static void get_volce_cb(void *userdata, size_t size) // 状态栏展开时会调用此函数查询参数
{
    *(int16_t *)userdata = vol; // 返回音量大小
}

static void set_volce_cb(void *userdata, size_t size) // 用户滑动滑动条时会调用此函数设置参数
{
    vol = *(uint16_t *)userdata; // 获取音量大小
    // 设置音量
    printf("volce:%d\n", vol);
}

static void create_volce_slider() // 调用此函数即可
{
    uint8_t pos[2] = {2, 5};     // 第6行第3列
    int16_t range[2] = {0, 100}; // 音量范围

    topic_messenger_list_t list = topic_messenger_list_create(); // 创建表

    topic_messenger_list_add(list, (void *)&app_status_bar_img_volume, 1); // 可选，不添加此行则不显示图标
    topic_messenger_list_add(list, pos, 2);                                // 必选，设置位置
    topic_messenger_list_add(list, (void *)"设置音量", 3);                 // 可选，不添加此行则不产生更改事件，如只需要长按或只需要显示某个数据的功能
    topic_messenger_list_add(list, (void *)"获取音量", 4);                 // 可选，不添加此行则滑动条不会同步系统数据，显示不实时
    topic_messenger_list_add(list, (void *)range, 7);                      // 必选，滑动条数据范围

    topic_messenger_msg("状态栏创建滑动条", &list, 0); // 发布主题消息进行创建

    topic_messenger_subscribe(NULL, "获取音量", get_volce_cb); // 订阅主题消息获取数据
    topic_messenger_subscribe(NULL, "设置音量", set_volce_cb); // 订阅主题消息设置数据
}

/*
此示例功能：
在控制中心第6行第3列创建了一个控制音量大小的滑动条
状态栏展开时，按钮会持续发布主题"获取音量"获取对应数据大小
按滑动条被滑动时，会发布主题"设置音量"通知，携带音量数据，用户订阅此主题即可获取音量大小进行相应控制
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////

void app_status_bar_example(void) // 外部extern调用此函数即可，需自己预先完成appmanager的初始化准备
{

#if STATUS_BAR_USE_TOPIC_MESSENGER

    topic_messenger_subscribe(NULL, "获取时间", init_read_time_cb); // 此主题订阅时间应早于app_manager_init();
    topic_messenger_subscribe(NULL, "获取电量 ", init_read_soc_cb); // 此主题订阅时间应早于app_manager_init();
#if STATUS_BAR_USE_CONTROL_CENTER
#if STATUS_BAR_USE_BRIGHTNESS
    topic_messenger_subscribe(NULL, "获取屏幕亮度", get_brightness_cb);
    topic_messenger_subscribe(NULL, "设置屏幕亮度", set_brightness_cb);
#endif
#if STATUS_BAR_USE_WIFI_LIST
    topic_messenger_subscribe(NULL, "获取WIFI信号", wifi_rssi_cb);
    topic_messenger_subscribe(NULL, "获取WIFI名称", wifi_name_cb);
#endif
#if STATUS_BAR_USE_WIFI_SWITCH || STATUS_BAR_USE_WIFI_LIST
    topic_messenger_subscribe(NULL, "设置WIFI状态", set_wifi_switch_cb);
    topic_messenger_subscribe(NULL, "获取WIFI状态", get_wifi_switch_cb);
#endif
#if STATUS_BAR_USE_MUSIC
    topic_messenger_subscribe(NULL, "获取音乐状态", get_music_sta_cb);
    topic_messenger_subscribe(NULL, "获取音乐时间", get_music_time_cb);
    topic_messenger_subscribe(NULL, "音乐控制", set_music_play_cb);
#endif
#endif

#endif

#if STATUS_BAR_USE_APP_MANAGER

    app_manager_register_t cfg;
    app_manager_config_struct_init(&cfg);

    cfg.name = "状态栏示例";
    cfg.create_ui = create_ui;
    cfg.author = "启凡科创";
    cfg.ui_type = APP_UI_HAVE;
    cfg.version = "V1.0.0";

    app_manager_register_app(&cfg);

    app_manager_open(0, "状态栏示例", (void *)LV_SCR_LOAD_ANIM_FADE_IN, 500, 0);
#else
    lv_scrr_load_anim(create_ui(NULL), LV_SCR_LOAD_ANIM_FADE_IN, 500, 0, 1);
#endif

    create_user_switch();  // 创建自定义按钮
    create_volce_slider(); // 创建自定义滑动条
}

#endif
